package org.jetlinks.demo.protocol.siterwell.tcp.message;

import lombok.AllArgsConstructor;
import lombok.Getter;
import lombok.NoArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.jetlinks.demo.protocol.siterwell.tcp.TcpPayload;
import org.jetlinks.demo.protocol.siterwell.tcp.util.ByteUtils;
import org.jetlinks.demo.protocol.siterwell.tcp.util.Validator;

/**
 * 赛特威尔网关 tcp 报文协议格式
 * 平台响应网关设备的消息类
 * 命令类型数据的格式
 * <p>
 * 第1字节   57		固定头（心跳数据除外）
 * 第2字节   01		流水号（回复时，此流水号需要一致）
 * 第3字节   20		版本号
 * 第4-6字节 339053		网关ID
 * 第7字节   16		网关GSM信号
 * 第8字节   16		子设备RF信号
 * 第9字节   01		子设备类型
 * 第10字节  3F		子设备最高2位ID
 * 第11字节  0A		网关类型(固定为0A)
 * 第12字节  21		命令 ， 写取传感器
 * 第13字节  00		数据长度
 * 中间字节是数据
 * 最后1个字节 27		校验值
 */
@NoArgsConstructor
@AllArgsConstructor
@Getter
@Slf4j
public abstract class AbstractCommandResponse implements TcpPayload {

    private AbstractCommandRequest request;

    @Override
    public void fromBytes(byte[] bytes, int offset) {
    }

    @Override
    public byte[] toBytes() {
        StringBuilder sb = new StringBuilder();
        String hexPayload = request.getHexPayload() ;
        String hexExceptDataLenHeader = ByteUtils.subHexStrByByte(hexPayload, 0, 12);
        String hexResponseData = getHexResponseData();
        int respDataLen = hexResponseData.length();
        Integer respDataByteLen = respDataLen / 2;
        sb.append(hexExceptDataLenHeader);                      // 除了数据长度之外的首部数据
        sb.append(ByteUtils.byteToHex(respDataByteLen.byteValue()));    // 数据长度
        sb.append(hexResponseData);                                     // 数据
        byte checkValue = Validator.calculateCheckValue(ByteUtils.hexStringToBytes(sb.toString()));
        sb.append(ByteUtils.byteToHex(checkValue));                     // 校验值
        if (log.isDebugEnabled()) {
            log.debug(String.format("response str : %s", sb));
        }
        return ByteUtils.hexStringToBytes(sb.toString());
    }

    protected abstract String getHexResponseData();
}
